/*
  时间困境
  题目描述
    小 z 正在为他的生日做准备。
    他想在餐馆点共有 n 道菜，餐厅给你送过来的时间为 ai, 你自己去餐厅拿的时间为 bi。
    不同的餐厅可以同时送餐，但在一段时间内你只能去一家餐厅。
    求 n 道菜全部到家的最小时间？
  输入格式
    第一行一个整数 n，代表想要订购的菜肴数量
    第二行 n 个整数 a[i]，
    第三行 n 个整数 b[i]，
    取值范围：n <= 2e5，1 <= (a[i], b[i]) <= 1e9
  输入数据 1
    4
    3 7 4 5
    2 1 2 4
  输出数据 1
    5
*/

#include <bits/stdc++.h>

using namespace std;

/*
  思路:
    通常采用二分答案算法的话, 需要首先明确 2 个核心问题:
      1) 答案的取值范围(区间)，即确定区间的最大值和最小值
      2) 判断某个答案是否满足题意(条件)的判定方法
    解答本题时，先明确出这 2 个问题:
      1）答案的取值范围(区间)
          区间的最小值: n 道菜中，餐厅送餐和自己去餐厅取餐所花费的最小时间;
          区间的最大值: n 道菜中餐厅将其送过来需要的最大时间;
      2) 判断某个答案是否满足题意的判定方法:
          遍历每道菜，如果餐厅送这道菜的时间大于答案，则该道菜由自己去餐厅取；
          统计 n 道菜中需要自己去餐厅取使用的时间之和 num。
          如果 num 小于等于答案，则该答案满足题目要求；
          否则，则该答案不满题目要求!
*/

int n;
int a[200005] = {};  // a[i] 表示第 i 道菜，餐厅将其送过来需要的时间 (其中 i > 0)
int b[200005] = {};  // b[i] 表示第 i 道菜，自己去餐厅拿需要的时间 (其中 i > 0)
int s = INT_MAX, e = 0;  // s(start) 表示二分答案算法实现中进行二分查找时的开始边界(左边界)
                         // e(end)   表示二分答案算法实现中进行二分查找时的结束边界(右边界)

// 该函数用来判断输入 x(表示答案，即 n 道菜全部到家所用时间) 是否满足条件(题目要求)
bool check(int x) {
    long long num = 0; // 自己去餐厅拿菜用去的时间之和

    // 如果 "自己去餐厅拿菜用的时间之和" 小于等于 x (答案)，则该答案满足题目要求；
    // 否则，则该答案不满题目要求!
    for (int i = 1; i <= n; i++) {
        if (x < a[i]) {
            num += b[i];
        }
    }

    return num <= x;
}

int main() {
    cin >> n;
    for (int i = 1; i<= n; i++) {
        cin >> a[i];
        if (a[i] > e) {
            e = a[i];  // 答案区间的最大值: n 道菜中餐厅将其送过来需要的最大时间;
        }
        if (a[i] < s) {
            s = a[i];
        }
    }
    for (int i = 1; i <= n; i++) {
        cin >> b[i];
        if (b[i] < s) {
            s = b[i]; // 答案区间的最小值: n 道菜中，餐厅送餐和自己去餐厅取餐所花费的最小时间;
        }
    }

    /*
      用二分查找法，在答案的区间范围内，查找满足题目要求的最小值
      注意:
        特别技巧: 我们在编码时，要保证区间的最大值 e 一定大于等于 区间的最小值 s
                 这样就可以保证一定会进行一次循环处理!
    */
    int ans;
    while (s <= e) {
        int mid = (s + e) / 2 ;
        if (check(mid)) {
            ans = mid;
            e = mid - 1; // 由于需要答案尽可能地小，所以我们进一步从 mid 的左半区间进行查找
        } else {
            s = mid + 1; // mid 不满足题目要求，从 mid 的右半区间进行查找
        }
    }
    cout << ans;

    return 0;
}